# 在 Python 中，变量都是对象的引用，因此参数传递都是传递对象的引用。但是，由于 Python 中有可变对象和不可变对象之分，所以行为上会有所不同。
# 引用是指在编程语境中，用于标识和访问内存中的某个对象的方式，引用本质上就是对象的内存地址。在Python中，变量实际上是对象的引用，它们指向存储在内存中的特定对象。
# 当我们创建一个变量并将某个对象赋值给它时，实际上是在为这个对象创建了一个引用。这个引用指向一个内存地址，它告诉计算机在哪里可以找到这个对象的数据。
# 通过引用，我们可以使用变量来访问和操作对象，而不需要直接处理对象在内存中的位置。这样的引用机制带来了很多优势，包括灵活性、内存管理和代码的简化。
# 在函数调用中，当你将一个对象作为参数传递给函数时，实际上是将该对象的引用传递给了函数。这意味着函数内部可以通过这个引用来访问和操作原始对象。这也解释了为什么在函数内部修改可变对象会影响到原始对象，而在其函数内部重新赋值不会影响原始对象。
# 总之，引用是一种使程序能够有效地访问和操作内存中的对象的机制。在Python中，变量是对象的引用，函数参数传递的是对象的引用，这种引用机制是语言的基础之一。
# "传对象引用"相当于传值和传引用的一种综合，具体行为取决于对象是否可变。当函数收到的实际参数是不可变对象的引用时，函数内部会创建一个新的对象并将相同的值赋给它，进行的是值传递；当函数收到的实际参数是可变对象的引用时，会直接使用原始对象的引用，进行的是引用传递。
a=1#不可变类型
def func(x):
    print('x地址{}'.format(id(x)))
    x=2#重新赋值，内存地址改变
    print('x值修改后地址{}'.format(id(x)))
    print(x)
    pass
# 调用函数
func(a)
print('a地址{}'.format(id(a)))
print(a)
li=[]#可变类型
def testRenc(parms):
    li.append([1,3,3,54,67])#修改值，内存地址不变
    print(id(parms))
    print('内部的变量{}'.format(parms))
    pass
print(id(li))
testRenc(li)
print('外部的变量{}'.format(li))
# 在Python中，实参传递的是对象的引用。这意味着函数内部使用实参对象的引用来访问和操作该对象。
# 可变对象： 如果传递给函数的对象是可变的（如列表、集合、字典等），函数内部对该对象的修改会影响到原始对象，这意味着函数内部修改使用的是原始对象的引用，而不是一个新的对象。当对可变对象进行修改时，修改操作会在原始对象上生效，因为函数内外引用的是同一个对象。
# 不可变对象： 对于不可变对象（如整数、字符串、元组等），函数内部的操作不会影响到原始对象，因为对这些对象的操作会创建一个新的对象，而不会修改原始对象。
# 在Python中，参数传递都是通过对象引用进行的，这包括不可变对象和可变对象。不可变对象是指一旦创建后其值就不能被改变的对象，如整数、字符串和元组。当你将一个不可变对象作为参数传递给函数时，实际上也是将该对象的引用传递给了函数。
# 但在函数内部会创建一个新的对象，因为不可变对象的值无法在原地修改，所以在函数内部对不可变对象的修改实际上是在新的对象上，并将函数内部的引用指向了这个新对象，原始对象不会受到影响。
# 函数可以作为参数传入，此时是计算逻辑的传入，而非数据的传入，这样可以动态地改变传入的函数，而不需要修改高阶函数的内部逻辑，使得代码更加灵活和可配置。